package com.example.workflow.mapper;


import com.example.workflow.dto.ApprovalInfo;
import com.example.workflow.dto.DispatcherOrder;
import com.example.workflow.dto.FormDto;
import com.example.workflow.pojo.Form;
import com.example.workflow.vo.FormVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.security.core.parameters.P;

import java.util.Collection;
import java.util.Date;
import java.util.List;

/**
 * @author
 * @version 1.0
 * @date 2025/4/15
 */

@Mapper
public interface FormMapper {


    /**
     * 新建工单
     *
     * @param form
     */
    void create(Form form);

    /**
     * 修改草稿工单
     *
     * @param formDto 工单信息
     */
    void updateDraft(FormDto formDto);

    /**
     * 正式提交工单
     *
     * @param form 表单信息
     */
    void submit(FormDto form);

    /**
     * 个人要审批的工单
     *
     * @param types
     * @param stand
     * @return
     */
    List<FormVo> list(@Param("list") List<String> types, @Param("stand") String stand,@Param("id")Long id,@Param("type")String type);

    /**
     * 超时未审批工单数量统计
     *
     * @param types
     * @param pendingL1
     * @return
     */
    long timeoutList(@Param("list") List<String> types,@Param("stand") String pendingL1);

    /**
     * 设计的特别查找工单
     *
     * @param id
     * @param type
     * @param stand
     * @return
     */
    List<FormVo> adminList(@Param("id")Long id,@Param("type")String type, @Param("stand") String stand);

    /**
     * 操作审批的工单
     *
     * @param types
     * @param department
     * @return
     */
    List<FormVo> operatorList(@Param("list") List<String> types, @Param("department") String department,@Param("id")Long id,@Param("subtype")String type, @Param("stand") String stand);

    /**
     * 超时未操作工单数量统计
     *
     * @param types
     * @param department
     * @return
     */
    long timeoutOperatorList(@Param("list") List<String> types,@Param("department") String department);

    /**
     * 个人申请的工单
     *
     * @param createUser
     * @return
     */
    List<FormVo> draftBox(@Param("createUser") Integer createUser,@Param("id")Long id,@Param("type")String type, @Param("stand") String stand);

    /**
     * 审批工单（一级审批）
     *
     * @param approvalInfo
     */
    int approval(ApprovalInfo approvalInfo);

    /**
     * 审批工单（二级审批）
     *
     * @param approvalInfo
     */
    int approvalSecond(ApprovalInfo approvalInfo);

    /**
     * 审批驳回
     *
     * @param approvalInfo
     */
    int reject(ApprovalInfo approvalInfo);


    /**
     * 分派工单
     *
     * @param dispatcherOrder 分派信息
     */
    void dispatcher(DispatcherOrder dispatcherOrder);

    /**
     * 工单详情
     *
     * @param id
     * @return
     */
    Form details(@Param("orderId") Long id);

    /**
     * 完成工单
     *
     * @param orderId 工单ID
     */
    void complete(@Param("orderId") Long orderId,@Param("finishTime") Date finishTime);

    /**
     * 协助|其中一个部门完成后回退到processing处理
     *
     * @param orderId
     */
    void back(Long orderId);

    /**
     * 驳回（二次审批驳回）
     *
     * @param approvalInfo
     */
    int rejectSecond(ApprovalInfo approvalInfo);

    /**
     * 二次审批后添加信息
     *
     * @param orderId
     */
    void insertLog(@Param("orderId") Long orderId);

    /**
     * 修改日志第一项（主部门）
     *
     * @param orderId
     * @param id
     * @param log
     */
    void updateFirst(@Param("orderId") Long orderId,@Param("userId") Integer id,@Param("log") String log,@Param("date") Date date);

    /**
     * 修改日志第二项（协助部门）
     *
     * @param orderId
     * @param id
     * @param log
     */
    void updateSecond(@Param("orderId") Long orderId, @Param("userId") Integer id, @Param("log") String log, @Param("date") Date date);

    /**
     * 完成第一项
     *
     * @param orderId
     * @param id
     * @param log
     */
    void completeFirst(@Param("orderId") Long orderId,@Param("userId") Integer id,@Param("log") String log,@Param("date") Date date);

    /**
     * 完成第二项
     *
     * @param orderId
     * @param id
     * @param log
     */
    void completeSecond(@Param("orderId") Long orderId,@Param("userId") Integer id,@Param("log") String log,@Param("date") Date date);

    /**
     * 删除草稿工单
     *
     * @param id
     */
    void delete(@Param("id") Long id);

    /**
     * 简要查询工单id
     *
     * @param types 子类型
     * @param stand 状态
     * @return
     */
    List<Long> listPrimary(@Param("list") List<String> types, @Param("stand") String stand);

    /**
     * 操作人员的简要查询工单id
     *
     * @param types 子类型
     * @param department 部门
     * @return
     */
    List<Long> getPrimary(@Param("list") List<String> types, @Param("department") String department);

    /**
     * 修改工单状态
     *
     * @param dispatcherOrder
     */
    void operate(DispatcherOrder dispatcherOrder);
}
